package models.games;

import java.util.Random;
import java.util.Scanner;

import core.User;

/**
 * Gioco che richiede all'utente di verificare se il colore proposto (a riga di
 * comando sotto forma di intero) corrisponde al significato corrispondente.
 * 
 * @author Stefano
 * 
 */
public class ColoriEParole extends Game {
	protected enum Colore {
		NERO, BLU, GIALLO, ROSSO, VERDE
	};

	// private Colore [] possibleColor = { Colore.NERO, Colore.BLU,
	// Colore.GIALLO, Colore.ROSSO, Colore.VERDE};
	// private Colore [] color;
	// private Colore [] wordColor;
	private String[] possibleColor = { "NERO", "BLU", "GIALLO", "ROSSO",
			"VERDE" };
	private String[] colorMeaning;
	private String[] coloredWord;
	private final int NUM_COLORI = 5;
	private int gameCount = 1; // conta il numero di confronti fatti
	private Random random = new Random();

	public ColoriEParole(User user) {
		super(user);
		coloredWord = new String[NUM_COLORI];
		colorMeaning = new String[NUM_COLORI];
		randomize(); // riempie gli array in modo casuale
	}

	/**
	 * Avvia il gioco a riga di comando scegliendo quante partite fare. Questo
	 * parametro sar� poi sostituito da un timer quando verr� implementato con
	 * Controller e View
	 * 
	 * @param numPartite
	 *            : Quanti confronti si voglio fare nella sessione di gioco
	 *            corrente
	 * 
	 */
	public void startGame(int numPartite) {
		int contaPartite = 0;
		System.out
				.println("Verifica se il primo colore 0(NERO) 1(BLU) 2(GIALLO) 3(ROSSO) 4(VERDE)\n"
						+ "corrisponde con il colore con cui � scritta la stringa consecutiva\n"
						+ "Comando: SI/NO ENTER");
		randomize(); // prepara gli array per il gioco
		Scanner sc = new Scanner(System.in);
		String cmd = "";
		int i = 0;

		// ciclo di gioco
		while (contaPartite < numPartite) {
			String stringaColoreCasuale = casualStringColor();
			System.out.println("> " + colorMeaning[i] + "   "
					+ stringaColoreCasuale + " scritta in " + coloredWord[i]);
			System.out.println();
			cmd = sc.nextLine();
			if (cmd.equalsIgnoreCase("STOP"))
				break;
			else if (verify(cmd, i)) {
				setScore(getScore() + 1);
				System.out.println("Score: " + getScore());
			} else
				System.out.println("Errore\nScore: " + getScore());
			contaPartite++;
			if (i == NUM_COLORI - 1) // processato l'ultimo elemento degli array
				randomize();
			i = (i + 1) % NUM_COLORI;
		}// while
		System.out.println("Terminato ColoriEParole");

	}// startGame

	/**
	 * @return Stringa che rappresenta un colore e della quale nel gioco
	 *         interessa il colore del carattere con cui � scritta.
	 */
	public String casualStringColor() {
		int randomC = random.nextInt(NUM_COLORI);
		return possibleColor[randomC].toString();
	}

	/**
	 * Controlla se l'input corrente SI o NO corrisponde o meno con la
	 * situazione degli elementi degli array di indice i
	 * 
	 * @param cmd
	 *            : Input Utente SI o NO
	 * @param i
	 *            : Indice corrente
	 * @return true: se l'input corrisponde alla situazione corrente; false:
	 *         altrimenti
	 */
	public boolean verify(String cmd, int i) {
		gameCount++;
		if (cmd.equalsIgnoreCase("SI")
				&& colorMeaning[i].equals(coloredWord[i])) {
			score = score + 250 + 250 * level;
			return true;
		}

		else if (cmd.equalsIgnoreCase("NO")
				&& !(colorMeaning[i].equals(coloredWord[i]))) {
			score = score + 250 + 250 * level;
			return true;
		}
		return false;
	}// verify

	/**
	 * Mescola gli elementi degli array colore e significato. Viene usato un
	 * oggetto Random per scegliere in modo casuale il colore/significato da
	 * inserire in posizione i.
	 */
	public void randomize() {

		int i = 0;
		while (i < NUM_COLORI) {
			int randomS = random.nextInt(NUM_COLORI);
			int randomC = random.nextInt(NUM_COLORI);
			colorMeaning[i] = possibleColor[randomC];
			coloredWord[i] = possibleColor[randomS];
			i++;
		}
	}// randomize

	public String[] getColorMeaning() {
		return colorMeaning;
	}

	public String[] getColoredWord() {
		return coloredWord;
	}

	public int getGameCount() {
		return gameCount;
	}

	@Override
	public int getGameKey() {
		return 7;
	}

}
